根据上一次的LM386的设计【参考1】,以及网上的设计【参考2】,用Arduino做一个音量计。首先,音频从MIC进入,经过LM386的放大后接入到Arduino的模拟输入上,经过 DAC 量化之后显示在 1602上。
电路方面,和【参考1】差别在于我们不再使用喇叭而是直接将放大后的OUT信号接入到 Arduino的A5上。
显示方面,我们使用【参考3】提到的方法来自定义字符充当强度指示。
下面的图片与其说是原理图不如说是连接图更合适
![vu1](https://www.lab-z.com/wp-content/uploads/2015/04/vu11-1024x726.png)
//www.lab-z.com
//在 1602 上显示音量的小程序
#include
#include "LiquidCrystal_I2C.h"
int value=100;
// custom charaters
LiquidCrystal_I2C lcd(0x27,16,2);
//定义进度块
byte p1[8] = {
0x10,
0x10,
0x10,
0x10,
0x10,
0x10,
0x10,
0x10};
byte p2[8] = {
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18};
byte p3[8] = {
0x1C,
0x1C,
0x1C,
0x1C,
0x1C,
0x1C,
0x1C,
0x1C};
byte p4[8] = {
0x1E,
0x1E,
0x1E,
0x1E,
0x1E,
0x1E,
0x1E,
0x1E};
byte p5[8] = {
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F};
void setup() {
lcd.init(); //初始化LCD
lcd.backlight(); //打开背光
//将自定义的字符块发送给LCD
//P1 是第一个,P2 是第二个,以此类推
lcd.createChar(0, p1);
lcd.createChar(1, p2);
lcd.createChar(2, p3);
lcd.createChar(3, p4);
lcd.createChar(4, p5);
//MIC输入放大之后在 A0 输入Arduino
pinMode(A0, INPUT);
}
//显示音量强度
//从左到右一共有 5 * 16 =80 点,一共是 80+1=81 个状态
void showprg(int value)
{
//第一行显示当前VU值
lcd.setCursor(0,0);
lcd.print(" VU=");
lcd.print(value);
//移动光标到第二行
lcd.setCursor(0,1);
//显示全黑的块
for (int i=1;i |